package bean

import (
	"container/list"
	"d-serv-go/server/core/consts"
	"encoding/json"
	"github.com/kirinlabs/utils/str"
)

var (
	/**_SAVEIDS_:保存成功的主键信息，多个逗号分隔*/
	SAVE_IDS string = "_SAVEIDS_"
	/**_DELIDS_:删除成功的主键信息，多个逗号分隔*/
	DEL_IDS = "_DELIDS_"
	/**_OKCOUNT_:操作成功的数量*/
	DATA_COUNT = "_OKCOUNT_"
	/**_PAGE_: 分页包装标签 */
	PAGE = "_PAGE_"
	/**_ADD_:byid时是否添加模式，用于提供给byid前后端判断是否为添加模式 */
	BYID_ADD_FLAG = "_ADD_"
	/**_COLS_:query返回的标题列*/
	QUERY_COLS = "_COLS_"

	/**_DISP_: 通过dispatcher方式的JSP跳转 */
	TO_DISP = "_DISP_"
	/**_DIRE_: 通过redirect的URL跳转 */
	TO_DIRE = "_DIRE_"
	/**_HTML_: 直接通过html流进行输出 */
	TO_HTML = "_HTML_"
	/**_XML_: 直接通过xml流进行输出 */
	TO_XML = "_XML_"
	/**_LOGIN_: 跳转登录页面 */
	TO_LOGIN string = "_LOGIN_"
)

type OutBean struct {
	Bean
}

func NewOutBean() *OutBean {
	return &OutBean{Bean: *NewBean("")}
}

func (o *OutBean) SetOk(msg string) *OutBean {
	o.Set(consts.RTN_MSG, consts.RTN_MSG_OK+msg)
	return o
}

func (o *OutBean) SetError(msg string) *OutBean {
	o.Set(consts.RTN_MSG, consts.RTN_MSG_ERROR+msg)
	return o
}

func (o *OutBean) IsOk() bool {
	return str.StartsWith(o.GetStr(consts.RTN_MSG), consts.RTN_MSG_OK)
}

/**
 * 对象构造方法
 *
 * @param outBean 数据对象
 */
func NewOutBean2(bean Bean) *OutBean {
	return &OutBean{bean}
}

/**
 * 获取执行结果列表
 * 【query、finds：会返回查询的列表数据】
 * 【delete：会返回删除成功的列表数据】
 * 【batchSave:批量保存成功的数据结果列表】
 * @return 结果列表
 */
func (o *OutBean) GetDataList() *list.List {
	return o.GetList(consts.RTN_DATA)
}

/**
 * 获取操作成功的数据
 * @return 操作成功的数据
 */
func (o *OutBean) GetData() interface{} {
	return o.Get(consts.RTN_DATA)
}

/**
 * 设置操作成功的数据列表
 * 【query、finds:设置查询出的数据结果列表】
 * 【delete:设置删除成功的数据结果列表】
 * 【batchSave:批量保存成功的数据结果列表】
 * 【count:查询的合计数】
 * @param data 操作成功的数据
 * @return 本对象
 */
func (o *OutBean) SetData(data interface{}) *OutBean {
	o.Set(consts.RTN_DATA, data)
	return o
}

func (o *OutBean) UnmarshalJSON(bytes []byte) error {
	panic("implement me")
}

func (o *OutBean) MarshalJSON() ([]byte, error) {
	return json.Marshal(&o.Data)
}

/**
 * 获取操作成功的数量
 * 【query:返回总查询记录数，不是分页内实际返回的记录数】
 * 【finds:返回总查询记录数】
 * 【delete:返回实际删除的记录数】
 * @return 操作成功的数量
 */
func (o *OutBean) getCount() int64 {
	return o.GetInt64(DATA_COUNT)
}

/**
* 设置操作成功的数量
* @param count 设置操作成功的数量
* @return 本对象
 */
func (o *OutBean) SetCount(count int) *OutBean {
	o.Set(DATA_COUNT, count)
	return o
}

/**
* 获取删除成功的ID列表，多个ID的话之间逗号分隔，同时支持单个ID
* 【delete、batchSave:方法用到】
* @return 删除成功的ID列表
 */
func (o *OutBean) GetDeleteIds() string {
	return o.GetStr(DEL_IDS)
}

/**
* 设置删除成功的ID列表，多个ID的话之间逗号分隔，同时支持单个ID
* 【delete、batchSave:方法用到】
* @param ids 删除成功的ID列表
* @return 本对象
 */
func (o *OutBean) SetDeleteIds(ids string) *OutBean {
	o.Set(DEL_IDS, ids)
	return o
}

/**
* 获取保存成功的ID列表，多个ID的话之间逗号分隔，同时支持单个ID
* 【save、batchSave:保存成功的ID列表，包含添加的和修改的】
* @return 保存成功的ID列表
 */
func (o *OutBean) GetSaveIds() string {
	return o.GetStr(SAVE_IDS)
}

/**
* 设置保存成功的ID列表，多个ID的话之间逗号分隔，同时支持单个ID
* 【save、batchSave:保存成功的ID列表，包含添加的和修改的】
* @param ids 保存成功的ID列表
* @return 本对象
 */
func (o *OutBean) SetSaveIds(ids string) *OutBean {
	o.Set(SAVE_IDS, ids)
	return o
}

/**
* 获取分页信息（含总记录数等）
* 【query:获取分页输出】
* @return 分页信息
 */
func (o *OutBean) GetPage() *PageBean {
	return o.Get(PAGE).(*PageBean)
}

/**
* 设置分页信息
* 【query:设置自定义分页输出】
* @param page 分页信息
* @return 当前对象
 */
func (o *OutBean) SetPage(page *PageBean) *OutBean {
	o.Set(PAGE, page)
	return o
}

/**
* 设置分页信息，用于快速进行页面设定，只有一个分页，一个页面显示全部数据
* 【query:获取自定义分页输出】
* @param showNum 实际数据数量
* @return 当前对象
 */
func (o *OutBean) SetPageNum(showNum int) *OutBean {
	page := PageBean{}
	page.SetPages(1).SetShowNum(showNum).SetAllNum(showNum)
	o.Set(PAGE, page)
	return o
}

///设置标题列信息
func (o *OutBean) SetCols(cols *Bean) *OutBean {
	o.Set(QUERY_COLS, cols)
	return o
}

///**
// * 获取标题列信息
// * @return 标题列信息
// */
//func LinkedHashMap<String, Bean> getCols() {
//	return o.getLinkedMap(QUERY_COLS
//	QUERY_COLS)
//}
//
//
/**
* 获取处理结果信息
* @return 处理结果信息
 */
func (o *OutBean) GetMsg() string {
	return o.GetStr(consts.RTN_MSG)
}

//
///**
// * 设置信息
// * @param msg 信息内容
// * @return 当前对象
// */
func (o *OutBean) SetMsg(msg string) *OutBean {
	o.Set(consts.RTN_MSG, msg)
	return o
}

//
///**
// * 设置缺省的成功信息
// * @return 当前对象
// */
//public OutBean setOk() {
//return setOk("")
//}
//
///**
// * 设置成功信息
// * @param msg 信息内容，可以为空
// * @return 当前对象
// */
//public OutBean setOk(String msg) {
//o.set(Constant.RTN_MSG, Constant.RTN_MSG_OK + msg)
//return o
//}
//
///**
// * 设置警告信息
// * @param msg 信息内容，可以为空
// * @return 当前对象
// */
func (o *OutBean) setWarn(msg string) *OutBean {
	o.Set(consts.RTN_MSG, consts.RTN_MSG_WARN+msg)
	return o
}

func (o *OutBean) SetWarn(msg string) *OutBean {
	o.Set(consts.RTN_MSG, consts.RTN_MSG_WARN+msg)
	return o
}

//
///**
// * 设置缺省的失败信息
// * @return 当前对象
// */
//public OutBean setError() {
//return setError("")
//}
//
///**
// * 设置失败信息
// * @param msg 信息内容，可以为空
// * @return 当前对象
// */
//public OutBean setError(String msg) {
//o.set(Constant.RTN_MSG, Constant.RTN_MSG_ERROR + msg)
//return o
//}
//
///**
// * 获取执行是否成功
// * @return 是否执行成功
// */
//public boolean isOk() {
//return o.getStr(Constant.RTN_MSG).startsWith(Constant.RTN_MSG_OK) ? true: false
//}
//
///**
// * 获取执行是否有警告或者成功信息
// * @return 是否有警告或者成功信息
// */
//public boolean isOkOrWarn() {
//return o.getStr(Constant.RTN_MSG).startsWith(Constant.RTN_MSG_ERROR) ? false: true
//}
//
///**
// * 获取byid用户添加模式还是修改模式，提供给前后端的按钮进行规则判断
// * 【byid:用于获取当前的byid方法是用于空白数据的添加模式还是已有数据的修改模式】
// * @return byid添加模式标志
// */
//public boolean getByidAddFlag() {
//return o.getBoolean(BYID_ADD_FLAG)
//}
//
///**
// * 设置byid用户添加模式还是修改模式，提供给前后端的按钮进行规则判断
// * 【byid:用于设置当前的byid方法是用于空白数据的添加模式还是已有数据的修改模式】
// * @param addFlag byid添加模式标志
// * @return 本对象
// */
//public OutBean setByidAddFlag(boolean addFlag) {
//o.set(BYID_ADD_FLAG, addFlag)
//return o
//}
//
///**
// * 获取需要通过dispatcher跳转的JSP或者Servlet地址URL
// * @return 需要跳转的JSP或者Servlet地址URL
// */
//public String getToDispatcher() {
//return o.getStr(TO_DISP)
//}
//
///**
// * 设置需要通过dispatche跳转的JSP或者Servlet地址URL
// * @param url 需要跳转的JSP或者Servlet地址URL，从"/"根开始
// * @return 本对象
// */
//public OutBean setToDispatcher(String url) {
//o.set(TO_DISP, url)
//return o
//}
//
///**
// * 获取需要通过redirect跳转的JSP或者Servlet地址URL
// * @return 需要跳转的JSP或者Servlet地址URL
// */
//public String getToRedirect() {
//return o.getStr(TO_DIRE)
//}
//
///**
// * 设置需要通过redirect跳转的JSP或者Servlet地址URL
// * @param url 需要跳转的JSP或者Servlet地址URL，从"/"根开始
// * @return 本对象
// */
//public OutBean setToRedirect(String url) {
//o.set(TO_DIRE, url)
//return o
//}
//
///**
// * 获取需要输出的Html字符串，servlet会通过流直接返回html代码
// * @return 需要输出的Html字符串
// */
//public String getToHtml() {
//return o.getStr(TO_HTML)
//}
//
///**
// * 设置需要输出的Html字符串，servlet会通过流直接返回html代码
// * @param htmlContent 需要输出的Html字符串
// * @return 本对象
// */
//public OutBean setToHtml(String htmlContent) {
//o.set(TO_HTML, htmlContent)
//return o
//}
//
///**
// * 获取需要输出的xml字符串，servlet会通过流直接返回xml代码
// * @return 需要输出的xml字符串
// */
//public String getToXml() {
//return o.getStr(TO_XML)
//}
//
///**
// * 设置需要输出的xml字符串，servlet会通过流直接返回xml代码
// * @param xmlContent 需要输出的xml字符串
// * @return 本对象
// */
//public OutBean setToXml(String xmlContent) {
//o.set(TO_XML, xmlContent)
//return o
//}
//
///**
// * 设置对象，支持级联设置
// * @param key   键值
// * @param obj   对象数据
// * @return o，当前Bean
// */
//public OutBean set(Object key, Object obj) {
//put(key, obj)
//return o
//}
